package yiran.agift.gui;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import yiran.agift.AGift;
import yiran.agift.lang.LangHelper;

import java.util.ArrayList;
import java.util.List;

public class GiftViewGUI {

    private static final int SIZE = 54;

    /**
     * 打开指定礼物的界面
     * 此方法负责根据提供的礼物ID获取礼物项，并在玩家界面中展示这些礼物项
     * 如果找不到礼物或礼物项为空，则向玩家显示相应的提示信息
     *
     * @param player 玩家对象，用于发送消息和打开界面
     * @param giftId 礼物ID，用于查询礼物项和礼物名称
     */
    public static void open(Player player, int giftId) {
        // 根据礼物ID获取礼物项数组
        ItemStack[] giftItems = AGift.getInstance().getGiftManager().getGift(giftId);
        // 如果礼物项数组为空或长度为0，则向玩家发送找不到礼物的消息，并返回
        if (giftItems == null || giftItems.length == 0) {
            player.sendMessage(LangHelper.getString("gift.not_found"));
            return;
        }
        // 获取礼物的名称
        String giftName = AGift.getInstance().getGiftManager().getGiftName(giftId);
        // 创建界面，并设置大小和标题
        Inventory inv = Bukkit.createInventory(
            player,
            SIZE,
            LangHelper.getString("gui.view_title").replace("%id%", String.valueOf(giftId))
        );
        // 遍历礼物项数组，将礼物项添加到界面中
        for (int i = 0; i < giftItems.length && i < SIZE - 9; i++) {
            // 检查礼物项是否为空
            if (giftItems[i] != null && giftItems[i].getType() != Material.AIR) {
                // 将礼物项克隆后添加到界面中
                inv.setItem(i, giftItems[i].clone());
            }
        }
        // 在界面中添加礼物信息项和关闭按钮
        inv.setItem(SIZE - 5, createInfoItem(giftId, giftName));
        inv.setItem(SIZE - 1, createCloseButton());
        // 打开界面
        player.openInventory(inv);
    }


    /**
     * 创建包含礼包信息的物品堆
     * 该方法用于生成一个特殊的物品堆，用于展示礼包的有关信息
     *
     * @param giftId 礼包的唯一标识符，用于内部区分不同的礼包
     * @param giftName 礼包的名称，显示在物品的附加上
     * @return 返回一个包含礼包信息的Book物品堆
     */
    private static ItemStack createInfoItem(int giftId, String giftName) {
        // 创建一个Book类型的ItemStack对象
        ItemStack info = new ItemStack(Material.BOOK);
        // 获取并设置物品的元数据
        ItemMeta meta = info.getItemMeta();
        // 设置物品显示名称为金色的"礼包信息"
        meta.setDisplayName(ChatColor.GOLD + "礼包信息");

        // 初始化物品的附加信息列表
        List<String> lore = new ArrayList<>();
        // 添加礼包的ID信息
        lore.add(ChatColor.GRAY + "ID: " + ChatColor.YELLOW + giftId);
        // 添加礼包的名称信息
        lore.add(ChatColor.GRAY + "名称: " + ChatColor.YELLOW + giftName);
        // 添加一个空行作为分隔
        lore.add("");
        // 添加提示信息，表明这仅仅是预览，无法取走物品
        lore.add(ChatColor.DARK_GRAY + "这只是预览，无法取走物品");

        // 将附加信息设置到物品元数据上
        meta.setLore(lore);
        // 将设置好的元数据应用回物品堆
        info.setItemMeta(meta);

        // 返回包含礼包信息的物品堆
        return info;
    }

    /**
     * 创建一个用于关闭界面的按钮
     * <p>
     * 此方法生成一个ItemStack对象，使用障碍物材料来象征关闭操作，并设置显示名为"关闭"
     * 使用ChatColor.RED为其显示名添加红色格式，以在界面上更直观地提示用户该按钮的功能
     *
     * @return ItemStack 代表关闭按钮的物品堆
     */
    private static ItemStack createCloseButton() {
        // 创建一个障碍物材质的物品堆，象征关闭操作
        ItemStack button = new ItemStack(Material.BARRIER);
        // 获取物品的元数据
        ItemMeta meta = button.getItemMeta();
        // 设置物品显示名为红色的"关闭"
        meta.setDisplayName(ChatColor.RED + "关闭");
        // 将修改后的元数据应用到物品上
        button.setItemMeta(meta);
        // 返回代表关闭按钮的物品堆
        return button;
    }

}
